Promise.prototype.myAll = function (fns) {
    return new Promise((resolve, reject) => {
        let result = [];
        for (let i = 0; i < fns.length; i++) {
            fns[i].call(this, ...args).then(res => {
                result[i] = res;
                if (result.length === fns.length) {
                    resolve(result)
                }
            }).catch((error) => {
                reject(error)
            })
        }
    })
}


Promise.prototype.allSettled = function () {

}

Promise.prototype.myRace = function (fns) {

}

Promise.prototype.myfinally = function () {

}

function promisify(func) {
    return function (...args) {
        return new Promise((resolve, reject) => {
            let callback = function (...args) {
                resolve(args)
            }
            // 给func函数主动塞入一个callback，这样在func中调用callback的时候实际执行的时候就是
            // 我们这里定义的callback函数，然后在我们的callback中调用resolve,
            // 这样一来，本来想要通过回调执行的操作就可以放在then函数中进行执行了
            func.apply(null, [...args, callback])
        })
    }
}

function promisify(fn) {
    return function () {
        const args = Array.prototype.slice.call(arguments)
        return new Promise((resolve, reject) => {
            fn.apply(this, [].concat(args).concat([(err, res) => {
                if (err != null) {
                    return reject(err)
                }
                resolve(res)
            }]))
        })
    }
}


// foo 可以是任何需要调用回调函数的函数
function foo(str1, str2, callback) {
    setTimeout(() => {
        console.log('setTimeout')
        // callback函数是通过最后一个参数这个位置来识别的，与callback这个名字无关
        callback(str1, str2)
    }, 1000)
}

// 这里的agent已经不是foo函数，而是我们在promisify中返回的自定义匿名函数
// 所以不需要纠结是否传入callback函数。
let agent = promisify(foo)

agent('hello', 'world')
    .then(res => {
        console.log(res)
    })


// https://www.jianshu.com/p/5643dc7491b3

// https://mp.weixin.qq.com/s/RLHXDZurwq9lcSmv6yMwKQ

// allSettled(promiseList) {
//     return new Promise(resolve=>{
//      let result=[],count=0
//      if (len===0) return resolve(result)

//      promiseList.forEach((promise,i)=>{
//       Promise.resolve(promise).then(value=>{
//        result[i]={
//         status:'fulfilled',
//         value:value
//        }
//        if (++count===promiseList.length) resolve(result)
//       },reason=>{
//        result[i]={

//         status:'rejected',
//         reason:reason
//        }
//        if (++count===promiseList.length) resolve(result)
//       })
//      })
//     })
//    }